#include "mousedialog.h"
#include "ui_mousedialog.h"

MouseDialog::MouseDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::MouseDialog)
    , m_drag(false)
{
    ui->setupUi(this);
}

MouseDialog::~MouseDialog()
{
    delete ui;
}

void MouseDialog::mousePressEvent(QMouseEvent *event)
{
    // 判断是否为左键按下
    if(event->button() == Qt::LeftButton)
    {
        // 判断鼠标按下的位置是否在label范围内
        // 1. 获取label位置
        QRect rect = ui->label->frameRect();
        // 2. 平移该位置，使其与鼠标使用相同的坐标系
        rect.translate(ui->label->pos());
        // 3. 判断
        if(rect.contains(event->pos()))
        {
            m_drag = true;
            m_pos = ui->label->pos() - event->pos();    // label位置减去鼠标的位置即为相对位置
            // 例如label的pos是(5, 5)，鼠标的pos是(8, 8)    // 减完就是(3, 3)
            qDebug() << "m_pos: " << m_pos;
            qDebug() << "label的pos: " << ui->label->pos();
            qDebug() << "鼠标的pos: " << event->pos();
        }
    }
}

void MouseDialog::mouseReleaseEvent(QMouseEvent *event)
{
    // 判断是否为左键抬起
    if(event->button() == Qt::LeftButton)
    {
        m_drag = false;
    }
}

void MouseDialog::mouseMoveEvent(QMouseEvent *event)
{
    if(m_drag)
    {
        // 计算label需要移动的新位置
        QPoint newPos = event->pos() + m_pos;

        // 限制label移动范围
        QSize s1 = size();                  // this->size();  获取父窗口大小
        QSize s2 = ui->label->size();       // 获取label大小
        // x ∈ [0, s1.width() - s2.width()]
        if(newPos.x() < 0)
        {
            newPos.setX(0);
        }
        else if(newPos.x() > s1.width() - s2.width())
        {
            newPos.setX(s1.width() - s2.width());
        }

        // y ∈ [0, s1.height() - s2.height()]
        if(newPos.y() < 0)
        {
            newPos.setY(0);
        }
        else if(newPos.y() > s1.height() - s2.height())
        {
            newPos.setY(s1.height() - s2.height());
        }

        // 移动到新位置
        ui->label->move(newPos);
    }
}
